package C9_8_IntroduceAssertion;

/**
 * @author xugang1
 * @updated 2022/7/25
 * @description 引入断言
 */

public class IntroduceAssertion {

    /**
     *断言：断言是一个条件表达式，应该总为真。
     * *失败表示程序出错，应该导致一个非受控异常
     *
     * *成品的程序其实是不需要断言的。
     *
     * *是一种作为交流和调试的辅助
     *
     * *利于找到bug
     *
     * *在j2SE1.4之前中其实并没有这种机制，可以简单写一个辅助类（Assert类）来实现
     */


    /**
     * 重构前
     */

    private static final double NULL_EXPENSE = -1.0;
    private double _expenseLimit = NULL_EXPENSE;
    private Project _primaryProject;

    public double getExpenseLimit() {//存在明显假设：员工要么又开支限额，要么参与某个项目
        return (_expenseLimit != NULL_EXPENSE) ?
                _expenseLimit :
                _primaryProject.getMemberExpenseLimit();
    }

    public boolean withinLimit(double expenseAmount) {
        return (expenseAmount <= getExpenseLimit())
    }









    /**
     * 重构后
     * ‘断言’指出存在的假设
     */

    public double getExpenseLimit() {
        Assert.isTrue(_expenseLimit != NULL_EXPENSE ||_primaryProject!=null)//断言
        return (_expenseLimit != NULL_EXPENSE) ?
                _expenseLimit :
                _primaryProject.getMemberExpenseLimit();
    }





    /**
     * 重构后2.0
     * 解决断言表达式不论什么情况都会被执行一遍（其实一点都不常用）
     *
     */
    public double getExpenseLimit() {
        if(Assert.ON){
            Assert.isTrue(_expenseLimit != NULL_EXPENSE ||_primaryProject!=null)//断言
            return (_expenseLimit != NULL_EXPENSE) ?
                    _expenseLimit :
                    _primaryProject.getMemberExpenseLimit();
        }

    }
}